/**
 * @file datapanel.cpp
 * @author trevrasher
 * @brief 
 * @version 0.1
 * @date 2024-05-8
 * 
 * @copyright Copyright (c) 2024
 * 
 */
#include "datapanel.h"
#include <QHBoxLayout>
#include <QLabel>
#include <QPixmap>
#include <QDir>

DataPanel::DataPanel(QWidget *parent) : QWidget(parent)
{
    m_layout = new QVBoxLayout(this);

    scrollArea = new QScrollArea(this);
    contentWidget = new QWidget(scrollArea);
    scrollArea->setWidget(contentWidget);
    scrollArea->setWidgetResizable(true);

    contentWidget->setLayout(m_layout);

    QVBoxLayout *mainLayout = new QVBoxLayout(this);

    // Создаем метку с текстом
    QLabel *titleLabel = new QLabel("Статистика", this);

    mainLayout->addWidget(titleLabel);

    mainLayout->addWidget(scrollArea);

    setLayout(mainLayout);

    contentWidget->setStyleSheet("background-color: #ffffff;");
}

/**
 * @brief Создает виджет для отображения записи о механоида.
 * 
 * @param mechanoidName Имя механоида.
 * @param health Здоровье механоида.
 * @param ammo Количество боеприпасов механоида.
 * @return Указатель на созданный виджет.
 */
QWidget *DataPanel::createEntryWidget(const QString &mechanoidName, int health, int ammo)
{
    QWidget *entryWidget = new QWidget();

    // Получаем путь к каталогу, в котором находится исполняемый файл приложения
    QString appDirPath = QCoreApplication::applicationDirPath(); // Всегда ..../shell/bin

    // Строим путь к каталогу с иконками относительно каталога приложения
    QString iconsDirPath = appDirPath + "/../src/plugins/modeling/output/mechanoid-panel/src/icons/";

    // Строим путь к иконкам
    QString robotIconPath = iconsDirPath + "robot.png";
    QString healthIconPath = iconsDirPath + "health.png";
    QString ammoIconPath = iconsDirPath + "ammo.png";    

    // Создаем компоновщик для элемента записи
    QHBoxLayout *entryLayout = new QHBoxLayout(entryWidget);

    QLabel *robotImageLabel = new QLabel();
    // Создаем и размещаем иконку механоида
    QPixmap robotPixmap(robotIconPath);
    robotImageLabel->setPixmap(robotPixmap.scaledToHeight(30, Qt::SmoothTransformation));
    entryLayout->addWidget(robotImageLabel);

    // Создаем метку с именем механоида
    QLabel *nameLabel = new QLabel(mechanoidName);
    entryLayout->addWidget(nameLabel);

    QLabel *healthIconLabel = new QLabel();
    // Создаем и размещаем иконку здоровья
    QPixmap healthIconPixmap(healthIconPath);
    healthIconLabel->setPixmap(healthIconPixmap.scaledToHeight(30, Qt::SmoothTransformation));
    entryLayout->addWidget(healthIconLabel);

    // Создаем метку с количеством здоровья
    QLabel *healthLabel = new QLabel(QString::number(health));
    entryLayout->addWidget(healthLabel);

    QLabel *ammoIconLabel = new QLabel();
    // Создаем и размещаем иконку боеприпасов
    QPixmap ammoIconPixmap(ammoIconPath);
    ammoIconLabel->setPixmap(ammoIconPixmap.scaledToHeight(30, Qt::SmoothTransformation));
    entryLayout->addWidget(ammoIconLabel);

    // Создаем метку с количеством боеприпасов
    QLabel *ammoLabel = new QLabel(QString::number(ammo));
    entryLayout->addWidget(ammoLabel);

    // Устанавливаем компоновщик для виджета элемента записи
    entryWidget->setLayout(entryLayout);

    return entryWidget;
}

/**
 * @brief Добавляет запись о статусе механоида.
 * 
 * @param mechanoidName Имя механоида.
 * @param health Здоровье механоида.
 * @param ammo Количество боеприпасов механоида.
 */
void DataPanel::addStatus(const QString &mechanoidName, int health, int ammo)
{
    if (!m_entries.contains(mechanoidName)) {
        MechEntry entry;
        entry.name = mechanoidName;
        entry.health = health;
        entry.ammo = ammo;
        entry.widget = createEntryWidget(mechanoidName, health, ammo);
        m_entries.insert(mechanoidName, entry);
        m_layout->addWidget(entry.widget);
    } else {
        updateStatus(mechanoidName, health, ammo);
    }
}

/**
 * @brief Обновляет данные механоида.
 * 
 * @param mechanoidName Имя механоида.
 * @param health Новое значение здоровья механоида.
 * @param ammo Новое значение количества боеприпасов механоида.
 */
void DataPanel::updateStatus(const QString &mechanoidName, int health, int ammo)
{
    if (!m_entries.contains(mechanoidName)) {
        return;
    }
    MechEntry &entry = m_entries[mechanoidName];
    entry.health = health;
    entry.ammo = ammo;

    // Найдем виджет записи и обновим его данные
    QWidget *entryWidget = entry.widget;
    if (!entryWidget) {
        return;
    }

    QHBoxLayout *layout = qobject_cast<QHBoxLayout*>(entryWidget->layout());
    if (!layout) {
        return;
    }

    QLabel *healthLabel = qobject_cast<QLabel*>(layout->itemAt(3)->widget());
    QLabel *ammoLabel = qobject_cast<QLabel*>(layout->itemAt(5)->widget());
    if (healthLabel && ammoLabel) {
        healthLabel->setText(QString::number(health));
        ammoLabel->setText(QString::number(ammo));
    } 
}

/**
 * @brief Удаляет запись о статусе механоида.
 * 
 * @param mechanoidName Имя механоида, статус которого требуется удалить.
 */
void DataPanel::deleteStatus(const QString &mechanoidName)
{
    if (!m_entries.contains(mechanoidName)) {
        return;
    }

    MechEntry &entry = m_entries[mechanoidName];
    m_layout->removeWidget(entry.widget);
    delete entry.widget;
    m_entries.remove(mechanoidName);
    
}
